﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraBars;
using CTEM.Models;
using CTEM.Controllers.BUS;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraEditors.DXErrorProvider;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid;

namespace CTEM.ModuleForms.ManageContractor
{
    public partial class SubcontractorManagement : DevExpress.XtraBars.Ribbon.RibbonForm
    {
        private List<SubcontractorDTO> listSubconstractor;
        private SubcontractorBUS subConstractorBUS;
        private List<SubcontractorDTO> historyList;
        private bool isNew;
        private bool isUpdate;
        public SubcontractorManagement()
        {
            InitializeComponent();
            listSubconstractor = new List<SubcontractorDTO>();
            subConstractorBUS = new SubcontractorBUS();
            historyList = new List<SubcontractorDTO>();
            isNew = false;
            isUpdate = false;
        }

        private void LoadSubConstructor()
        {
            listSubconstractor = subConstractorBUS.loadAllSubcontractorDTO();
            subcontractorDTOBindingSource.DataSource = listSubconstractor;
        }

        private void SubcontractorManagement_Load(object sender, EventArgs e)
        {
            LoadSubConstructor();
        }

        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            isNew = true;
        }

        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            if (isNew)
            {
                ColumnView view = sender as ColumnView;
                SubcontractorDTO subContractor = new SubcontractorDTO();
                subContractor = e.Row as SubcontractorDTO;
                String message = "";
                int pos = -1;
                if (!ValidateSubcontractor(subContractor, out message, out pos))
                {
                    e.Valid = false;
                    view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                    DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (result == DialogResult.No)
                    {
                        isNew = false;
                        e.Valid = true;
                        LoadSubConstructor();
                    }
                }
                else
                {
                    long success = subConstractorBUS.CreateSubcontractor(subContractor);
                    if (success == 0)
                    {
                        e.Valid = false;
                        DialogResult result = MessageBox.Show("Không thể tạo nhà thầu phụ\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                        if (result == DialogResult.No)
                        {
                            isNew = false;
                            e.Valid = true;
                            LoadSubConstructor();
                        }
                    }
                    else
                    {
                        subContractor.SubcontractorID = success;
                        subContractor.status = 1;
                        historyList.Add(subContractor);
                        isNew = false;
                        LoadSubConstructor();
                    }
                }
            }
        }

        private bool ValidateSubcontractor(SubcontractorDTO sub, out string output, out int i)
        {
            output = "";
            i = 0;
            if (String.IsNullOrEmpty(sub.SubcontractorName))
            {
                output = "Xin hãy nhập tên nhà thầu phụ";
                i = 1;
                return false;
            }
            else if (sub.SubcontractorName.Length > 50)
            {
                output = "Tên nhà thầu phụ không được quá 50 ký tự";
                i = 1;
                return false;
            }
            else if (sub.SubcontractorAddress.Length > 150)
            {
                output = "Địa chỉ không được quá 150 ký tự";
                i = 2;
                return false;
            }
            return true;
        }

        private void gridView1_InvalidRowException(object sender, InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = ExceptionMode.NoAction;
        }

        private void gridView1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
            if (e.PrevFocusedRowHandle == DevExpress.XtraGrid.GridControl.NewItemRowHandle)
            {
                if (isNew)
                {
                    gridView1.FocusedRowHandle = GridControl.NewItemRowHandle;
                }
            }
            if (isUpdate)
            {
                gridView1.FocusedRowHandle = e.PrevFocusedRowHandle;
            }
        }

        private void gridView1_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            if (!isNew)
            {
                ColumnView view = sender as ColumnView;
                int i = e.RowHandle;
                SubcontractorDTO subContractor = gridView1.GetRow(i) as SubcontractorDTO;
                SubcontractorDTO backupSubContractor = subConstractorBUS.LoadSubcontractorById(subContractor.SubcontractorID);
                String message = "";
                int pos = -1;
                if (!ValidateSubcontractor(subContractor, out message, out pos))
                {
                    DialogResult result = MessageBox.Show(message + "\nBạn có muốn nhập lại thông tin", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    view.SetColumnError(view.Columns[pos], message, ErrorType.Warning);
                    if (result == DialogResult.No)
                    {
                        isUpdate = false;
                        LoadSubConstructor();
                    }
                    else
                    {
                        isUpdate = true;
                        gridView1.FocusedRowHandle = i;
                        gridView1.FocusedColumn = e.Column;
                        return;
                    }
                }
                if (!subConstractorBUS.updateSubcontractor(subContractor))
                {
                    MessageBox.Show("Không thể cập nhật thông tin nhà thầu phụ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    isUpdate = false;
                }
                else
                {
                    isUpdate = false;
                    backupSubContractor.status = 2;
                    historyList.Add(backupSubContractor);
                }
            }
        }

        private void btnUndo_ItemClick(object sender, ItemClickEventArgs e)
        {
            if (historyList.Count > 0)
            {
                try
                {
                    SubcontractorDTO subContractor = historyList[historyList.Count - 1];
                    if (subContractor.status == 1)
                    {
                        subConstractorBUS.deleteSubcontractor(subContractor.SubcontractorID);
                    }
                    else if (subContractor.status == 2)
                    {
                        subConstractorBUS.updateSubcontractor(subContractor);
                    }
                    else if (subContractor.status == 3)
                    {
                        subConstractorBUS.CreateSubcontractor(subContractor);
                    }
                }
                catch
                {
                    MessageBox.Show("Không thể hồi phục dữ liệu này");
                }
                historyList.RemoveAt(historyList.Count - 1);
            }
            LoadSubConstructor();
        }

        private void btnDelete_ItemClick(object sender, ItemClickEventArgs e)
        {
            int[] numOfSelectedRows = gridView1.GetSelectedRows();
            if (numOfSelectedRows.Length > 0)
            {

                DialogResult dlg = MessageBox.Show("Bạn có chắc muốn xóa nhà thầu phụ này không?", "Cảnh báo", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                if (dlg == DialogResult.Yes)
                {
                    SubcontractorDTO subContractor = gridView1.GetRow(numOfSelectedRows[0]) as SubcontractorDTO;
                    SubcontractorDTO backupSubcontractor = subContractor;
                    bool result = subConstractorBUS.deleteSubcontractor(subContractor.SubcontractorID);
                    if (!result)
                    {
                        MessageBox.Show("Không thể xóa nhà thầu phụ " + subContractor.SubcontractorName);
                    }
                    else
                    {
                        backupSubcontractor.status = 3;
                        historyList.Add(backupSubcontractor);
                    }

                }
            }
            LoadSubConstructor();
        }




    }
}